package top.xia17.plugins.fast.common.database.mybatis.extension;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import jakarta.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * mybatis-plus 的基础Service
 * @author xia17
 * @since 2021/12/1 15:12
 */
public interface IbatisService<T,ID> {

    /**
     * 通过ID查询
     * @param id id
     * @return /
     */
    Optional<T> findById(ID id);

    /**
     * 通过id查询 ，如果没有则抛出 EntityNotFoundException
     * @param id id
     * @return /
     */
    T findByIdOrThrow(ID id);

    /**
     * 查询所有
     * @param query 查询条件可以为null
     * @return /
     */
    List<T> findAll(QueryWrapper<T> query);

    /**
     * 通过多个id查询
     * @param ids ids
     * @return /
     */
    List<T> findAllById(Collection<ID> ids);

    /**
     * 查询分页
     * @param query 查询条件，可以为null
     * @param pageable 分页条件
     * @return /
     */
    Page<T> findAll(QueryWrapper<T> query, Page<T> pageable);

    /**
     * 查询一个
     * @param query 查询条件，非空
     * @return /
     */
    Optional<T> findOne(@NotNull QueryWrapper<T> query);

    /**
     * 查询一个，如果没有找到则抛出 EntityNotFoundException
     * @param query 查询条件，非空
     * @return /
     */
    T findOneOrThrow(@NotNull QueryWrapper<T> query);

    /**
     * 新增一个实体
     * @param resource 资源实体
     * @return 新增后的实体
     */
    T create(T resource);

    /**
     * 更新实体
     * @param resource 资源实体
     * @return 更新后的实体
     */
    T update(T resource);

    /**
     * 通过id删除
     * @param id id
     */
    void deleteById(ID id);

    /**
     * 通过多个id删除
     * @param ids 多个id
     */
    void deleteById(Collection<ID> ids);

}
